import $ from 'jquery';
class Base{
    /**
     * [initPlayList 初始化奖金和玩法及说明]
     * @return {[type]} [description]
     */
    initPlayList(){
        this.play_list.set('r2',{   //play_list的数据结构用map，从下面可以看出，set是能级联操作的
            bonus:6,
            tip:'从01～11中任选2个或多个号码，所选号码与开奖号码任意两个号码相同，即中奖<em class="red">6</em>元',
            name:'任二'
        })
            .set('r3',{
                bonus:19,
                tip:'从01～11中任选3个或多个号码，选号与奖号任意三个号相同，即中奖<em class="red">19</em>元',
                name:'任三'
            })
            .set('r4',{
                bonus:78,
                tip:'从01～11中任选4个或多个号码，所选号码与开奖号码任意四个号码相同，即中奖<em class="red">78</em>元',
                name:'任四'
            })
            .set('r5',{
                bonus:540,
                tip:'从01～11中任选5个或多个号码，所选号码与开奖号码相同，即中奖<em class="red">540</em>元',
                name:'任五'
            })
            .set('r6',{
                bonus:90,
                tip:'从01～11中任选6个或多个号码，所选号码与开奖号码五个号码相同，即中奖<em class="red">90</em>元',
                name:'任六'
            })
            .set('r7',{
                bonus:26,
                tip:'从01～11中任选7个或多个号码，选号与奖号五个号相同，即中奖<em class="red">26</em>元',
                name:'任七'
            })
            .set('r8',{
                bonus:9,
                tip:'从01～11中任选8个或多个号码，选号与奖号五个号相同，即中奖<em class="red">9</em>元',
                name:'任八'
            })
    }
    /**
     * [initNumber 初始化号码]
     * @return {[type]} [description]
     */
    initNumber(){
        for(let i=1;i<12;i++){
            this.number.add((''+i).padStart(2,'0')) //number是set对象。补白功能是非常好用的
        }
    }

    /**
     * [setOmit 设置遗漏数据]
     * @param {[type]} omit [description]
     */
    setOmit(omit){
        let self=this;
        self.omit.clear();//把当前保留的遗漏数据清空。无论是map还是set，用clear就可以清除掉。数组或者object没有此方法
        for(let [index,item] of omit.entries()){ //omit是个map结构。保存到结构中
            self.omit.set(index,item)
        }
        $(self.omit_el).each(function(index,item){  //保存到页面中
            $(item).text(self.omit.get(index))
        });
    }

    /**
     * [setOpenCode 设置开奖]
     * @param {[type]} code [description]
     */
    setOpenCode(code){
        let self=this;
        self.open_code.clear();
        for(let item of code.values()){ // code是个map结构
            self.open_code.add(item);   //open_code用set格式，以为开奖号码不能重复
        }
        //调用更新获奖的接口
        self.updateOpenCode&&self.updateOpenCode.call(self,code);
    }

    /**
     * [toggleCodeActive 号码选中取消]
     * @param  {[type]} e [description]
     * @return {[type]}   [description]
     */
    toggleCodeActive(e){
        let self=this;
        let $cur=$(e.currentTarget);    //获取当前被选中的DOM
        $cur.toggleClass('btn-boll-active');    //jQuery的语法--切换类
        self.getCount(); //金额预算
    }

    /**
     * [changePlayNav 切换玩法]
     * @param  {[type]} e [description]
     * @return {[type]}   [description]
     */
    changePlayNav(e){
        let self=this;
        let $cur=$(e.currentTarget);    //点击子元素，事件委托在父元素，currentTarget获得的是子元素
        $cur.addClass('active').siblings().removeClass('active');   //当前的号码添加active类，其它号码取消这个类
        self.cur_play=$cur.attr('desc').toLocaleLowerCase();   //当前玩法，页面中玩法的描述desc中是大写的“R”，我们代码中用的是小写，这里做一下转换
        $('#zx_sm span').html(self.play_list.get(self.cur_play).tip);
        $('.boll-list .btn-boll').removeClass('btn-boll-active'); //切换玩法的时候清空上一次选中的号码
        self.getCount();    //重新计算：注数、金额、奖金等
    }

    /**
     * [assistHandle 操作区--全、大、小、奇、偶这几个选项]
     * @param  {[type]} e [description]
     * @return {[type]}   [description]
     */
    assistHandle(e){
        e.preventDefault(); //阻止默认时间
        let self=this;
        let $cur=$(e.currentTarget);
        let index=$cur.index(); //返回当前选中的集合的索引，用index()来识别选中了哪一个
        $('.boll-list .btn-boll').removeClass('btn-boll-active'); //清空上次的选择
        //全
        if(index===0){
            $('.boll-list .btn-boll').addClass('btn-boll-active');
        }
        //大
        if(index===1){
            $('.boll-list .btn-boll').each(function(i,t){
                if(t.textContent-5>0){
                    $(t).addClass('btn-boll-active')
                }
            })
        }
        //小
        if(index===2){
            $('.boll-list .btn-boll').each(function(i,t){
                if(t.textContent-6<0){
                    $(t).addClass('btn-boll-active')
                }
            })
        }
        //奇
        if(index===3){
            $('.boll-list .btn-boll').each(function(i,t){
                if(t.textContent%2==1){
                    $(t).addClass('btn-boll-active')
                }
            })
        }
        //偶
        if(index===4){
            $('.boll-list .btn-boll').each(function(i,t){
                if(t.textContent%2==0){
                    $(t).addClass('btn-boll-active')
                }
            })
        }
        self.getCount();    //重新计算
    }

    /**
     * [getName 获取当前彩票名称]
     * @return {[type]} [description]
     */
    getName(){
        return this.name
    }

    /**
     * [addCode 添加号码]
     */
    addCode(){
        let self=this;
        let $active=$('.boll-list .btn-boll-active').text().match(/\d{2}/g);    //取出当前选中号码的文本的值。text()返回的是所有选中的好的号拼成字符串，用后面那个来实现分割
        let active=$active?$active.length:0;  //注意这里
        let count=self.computeCount(active,self.cur_play);//算出注数
        if(count){
            self.addCodeItem($active.join(' '),self.cur_play,self.play_list.get(self.cur_play).name,count);
        }
    }

    /**
     * [addCodeItem 添加单次号码]
     * @param {[type]} code     [description]
     * @param {[type]} type     [description]
     * @param {[type]} typeName [description]
     * @param {[type]} count    [description]
     */
    addCodeItem(code,type,typeName,count){
        let self=this;
        const tpl=`
    <li codes="${type}|${code}" bonus="${count*2}" count="${count}">
		 <div class="code">
			 <b>${typeName}${count>1?'复式':'单式'}</b>
			 <b class="em">${code}</b>
			 [${count}注,<em class="code-list-money">${count*2}</em>元]
		 </div>
	 </li>
    `;
        $(self.cart_el).append(tpl);    //添加这段html代码，注意使用的是append()
        self.getTotal(); //获取总金额
    }

    /**
     * [getCount 统计]
     * @return {[type]} [description]
     */
    getCount(){
        let self=this;
        let active=$('.boll-list .btn-boll-active').length;
        let count=self.computeCount(active,self.cur_play);  //计算注数
        let range=self.computeBonus(active,self.cur_play);  //获取奖金范围
        let money=count*2;  //要花的钱=注数*2
        let win1=range[0]-money;    //最小盈利
        let win2=range[1]-money;    //最大盈利
        let tpl;    //模板的变量
        let c1=(win1<0&&win2<0)?Math.abs(win1):win1;    //上面两个盈利都小于0，也就是都亏了，就记录亏损的钱
        let c2=(win1<0&&win2<0)?Math.abs(win2):win2;    //和上面一样
        if(count===0){
            tpl=`您选了 <b class="red">${count}</b> 注，共 <b class="red">${count*2}</b> 元`
        }else if(range[0]===range[1]){  //如果最大盈利等于最小盈利
            tpl=`您选了 <b>${count}</b> 注，共 <b>${count*2}</b> 元  <em>若中奖，奖金：
			<strong class="red">${range[0]}</strong> 元，
			您将${win1>=0?'盈利':'亏损'}
			<strong class="${win1>=0?'red':'green'}">${Math.abs(win1)} </strong> 元</em>`
        }else{
            tpl=`您选了 <b>${count}</b> 注，共 <b>${count*2}</b> 元  <em>若中奖，奖金：
			<strong class="red">${range[0]}</strong> 至 <strong class="red">${range[1]}</strong> 元，
			您将${(win1<0&&win2<0)?'亏损':'盈利'}
			<strong class="${win1>=0?'red':'green'}">${c1} </strong>
			至 <strong class="${win2>=0?'red':'green'}"> ${c2} </strong>
			元</em>`
        }
        $('.sel_info').html(tpl);   //把结果输出到页面

    }

    /**
     * [getTotal 计算所有金额]
     * @return {[type]} [description]
     */
    getTotal(){
        let count=0;
        $('.codelist li').each(function(index,item){
            count+=$(item).attr('count')*1;
        })
        $('#count').text(count);
        $('#money').text(count*2);
    }

    /**
     * [getRandom 生成随机数]
     * @param  {[type]} num [description]
     * @return {[type]}     [description]
     */
    getRandom(num){
        let arr=[],index;
        let number=Array.from(this.number);  //1~11号码数组。Array.from()能把类似数组的集合(map或者set)转成真正的数组。number在上面的定义中是set
        while(num--){
            index=Number.parseInt(Math.random()*number.length);  // 索引。使用*number.length时为了保证生成的数都落在区间内
            arr.push(number[index]);    //保存结果
            number.splice(index,1);
        }
        return arr.join(' ');
    }

    /**
     * [getRandomCode 添加随机号码]
     * @param  {[type]} e [description]
     * @return {[type]}   [description]
     */
    getRandomCode(e){
        e.preventDefault();
        let num=e.currentTarget.getAttribute('count');  //getAttribute()是原声JS对象的方法--获取属性
        let play=this.cur_play.match(/\d+/g)[0];    //获取当前的玩法
        let self=this;
        if(num==='0'){  //等于0所说明是空的
            $(self.cart_el).html('')
        }else{
            for(let i=0;i<num;i++){
                self.addCodeItem(self.getRandom(play),self.cur_play,self.play_list.get(self.cur_play).name,1);//最后是“1”，因为机选的是单式
            }
        }
    }

}

export default Base
